package com.ittao.taoaicodemother.ai.tools;

import cn.hutool.json.JSONObject;
import com.ittao.taoaicodemother.exception.BusinessException;
import com.ittao.taoaicodemother.exception.ErrorCode;
import com.ittao.taoaicodemother.manage.storage.factory.FileStorageStrategyFactory;
import com.ittao.taoaicodemother.manage.storage.strategy.FileStorageStrategy;
import com.ittao.taoaicodemother.model.entity.App;
import com.ittao.taoaicodemother.service.AppService;
import jakarta.annotation.Resource;

import java.io.File;

/**
 * 工具基类
 * 定义所有工具的通用接口
 */
public abstract class BaseTool {

    @Resource
    protected AppService appService;

    @Resource
    protected FileStorageStrategyFactory fileStorageStrategyFactory;

    /**
     * 获取工具的英文名称（对应方法名）
     *
     * @return 工具英文名称
     */
    public abstract String getToolName();

    /**
     * 获取工具的中文显示名称
     *
     * @return 工具中文名称
     */
    public abstract String getDisplayName();

    /**
     * 判断是否为内部调用工具（不向前端显示调用信息）
     *
     * @return true表示内部工具，false表示前端工具
     */
    public boolean isInternalTool() {
        return false; // 默认为前端工具
    }

    /**
     * 生成工具请求时的返回值（显示给用户）
     *
     * @return 工具请求显示内容
     */
    public String generateToolRequestResponse() {
        return String.format("\n\n**🔧 [选择工具]** %s ⚡\n\n", getDisplayName());
    }

    /**
     * 生成工具执行结果格式（保存到数据库）
     *
     * @param arguments 工具执行参数
     * @return 格式化的工具执行结果
     */
    public abstract String generateToolExecutedResult(JSONObject arguments);

    /**
     * 根据 appId 获取用户ID
     * @param appId 应用ID
     * @return 用户ID
     */
    protected Long getUserIdByAppId(Long appId) {
        if (appId == null) {
            return null;
        }
        App app = appService.getById(appId);
        return app != null ? app.getUserId() : null;
    }

    /**
     * 获取当前存储策略
     * @return 当前存储策略
     */
    protected FileStorageStrategy getCurrentStorageStrategy() {
        return fileStorageStrategyFactory.getCurrentStrategy();
    }

    /**
     * 构建完整的文件路径
     * 整合路径构建逻辑到策略模式中
     *
     * @param appId 应用ID
     * @param relativePath 相对路径
     * @return 完整的文件路径
     */
    protected String buildFullFilePath(Long appId, String relativePath) {
        // 构建完整文件路径
        return buildProjectRootPath(appId) + File.separator + relativePath;
    }

    /**
     * 构建项目根路径
     * 用于获取项目的根目录路径
     *
     * @param appId 应用ID
     * @return 项目根路径
     */
    protected String buildProjectRootPath(Long appId) {
        // 使用策略模式获取当前存储策略
        FileStorageStrategy storageStrategy = getCurrentStorageStrategy();

        // 获取用户ID
        Long userId = getUserIdByAppId(appId);
        if (userId == null) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "无法获取用户ID - appId: " + appId);
        }

        // 基于策略模式构建项目根路径
        String projectName = "vue_project_" + appId;
        return storageStrategy.buildCodeOutputPath(String.valueOf(userId), projectName);
    }
}
